package org.aynu.userservice.service;

import com.baomidou.mybatisplus.extension.service.IService;
import org.aynu.userservice.common.UserResponse;
import org.aynu.userservice.model.User;
import org.aynu.userservice.model.Visitor;

import java.util.List;
import java.util.Map;

/**
 * 用户服务
 *
 * @author 小粥
 * @since 2025/03/02
 */

public interface UserService extends IService<User> {

    /**
     * 按名称或电话查找用户
     *
     * @param nameOrPhone 姓名或电话
     * @return {@link User }
     * @author 小粥
     * @since 2025/03/02
     */

    User findUserByNameOrPhone(String nameOrPhone);

    /**
     * 注册
     *
     * @param user 用户
     * @return {@link UserResponse }<{@link String }>
     * @author 小粥
     * @since 2025/03/02
     */

    UserResponse<String> register(User user);

    /**
     * 登录
     *
     * @param userEntity 用户实体
     * @return {@link UserResponse }<{@link Map }<{@link String }, {@link Object }>>
     * @author 小粥
     * @since 2025/03/02
     */

    UserResponse<Map<String, Object>> login(User userEntity);

    /**
     * 更新用户
     *
     * @param userEntity 用户实体
     * @return {@link UserResponse }<{@link Integer }>
     * @author 小粥
     * @since 2025/03/02
     */

    UserResponse<Integer> updateUser(User userEntity);

    /**
     * 重置密码
     *
     * @param username    用户名
     * @param email       电子邮件
     * @param newPassword 新密码
     * @return {@link UserResponse }<{@link String }>
     * @author 小粥
     * @since 2025/03/02
     */

    UserResponse<String> resetPassword(String username, String email, String newPassword);

    /**
     * 获取所有用户
     *
     * @param pageNum  页码
     * @param pageSize 页面大小
     * @return {@link UserResponse }<{@link Map }<{@link String }, {@link Object }>>
     * @author 小粥
     * @since 2025/03/02
     */

    UserResponse<Map<String, Object>> getAllUsers(int pageNum, int pageSize);

    /**
     * 创建用户
     *
     * @param user 用户
     * @return {@link UserResponse }<{@link Integer }>
     * @author 小粥
     * @since 2025/03/02
     */

    UserResponse<Integer> createUser(User user);

    /**
     * 按 admin 更新用户
     *
     * @param user 用户
     * @return {@link UserResponse }<{@link Boolean }>
     * @author 小粥
     * @since 2025/03/02
     */

    UserResponse<Boolean> updateUserByAdmin(User user);

    /**
     * 删除用户
     *
     * @param userId 用户 ID
     * @return {@link UserResponse }<{@link Boolean }>
     * @author 小粥
     * @since 2025/03/02
     */

    UserResponse<Boolean> deleteUser(int userId);

    /**
     * 创建 Admin
     *
     * @param admin 管理
     * @return {@link UserResponse }<{@link Integer }>
     * @author 小粥
     * @since 2025/03/02
     */

    UserResponse<Integer> createAdmin(User admin);


    // ----------------------- 访客相关方法 -----------------------

    /**
     * 登记访客
     *
     * @param visitor             游客
     * @param residentNameOrPhone 居民姓名或电话
     * @return {@link UserResponse }<{@link Integer }>
     * @author 小粥
     * @since 2025/03/02
     */

    UserResponse<Integer> registerVisitor(Visitor visitor, String residentNameOrPhone);

    /**
     * 批准访客
     *
     * @param visitorId 访客 ID
     * @param status    地位
     * @return {@link UserResponse }<{@link String }>
     * @author 小粥
     * @since 2025/03/02
     */

    UserResponse<String> approveVisitor(Integer visitorId, String status);

    /**
     * 获取所有访客
     *
     * @param pageNum  页码
     * @param pageSize 页面大小
     * @return {@link UserResponse }<{@link Map }<{@link String }, {@link Object }>>
     * @author 小粥
     * @since 2025/03/02
     */

    UserResponse<Map<String, Object>> getAllVisitors(int pageNum, int pageSize);

    /**
     * 按 User ID 获取访客
     *
     * @param userId   用户 ID
     * @param pageNum  页码
     * @param pageSize 页面大小
     * @return {@link UserResponse }<{@link Map }<{@link String }, {@link Object }>>
     * @author 小粥
     * @since 2025/03/02
     */

    UserResponse<Map<String, Object>> getVisitorsByUserId(Integer userId, int pageNum, int pageSize);

    /**
     * 删除访客
     *
     * @param visitorId 访客 ID
     * @return {@link UserResponse }<{@link String }>
     * @author 小粥
     * @since 2025/03/02
     */

    UserResponse<String> deleteVisitor(Integer visitorId);

    UserResponse<User> selectResident(Integer userId);

    UserResponse<Map<String, Object>> getFiveUsers();

    UserResponse<Integer> getUserCount();

    UserResponse<Map<String, Object>> selectAllUserId();

    UserResponse<List<User>> selectAllUser();


    UserResponse<List<Visitor>> queryVisitorByPhone(String phoneNumber);
}